package fwhmc.rt;

import fwhmc.rt.exception.RtRuntimeException;
import fwhmc.rt.function.BodyBuildFunction;
import fwhmc.rt.function.HeadersBuildFunction;
import fwhmc.rt.function.ParameterBuildFunction;
import fwhmc.rt.function.RequestResultFunction;
import fwhmc.rt.utils.SendEnvironmentType;
import org.springframework.http.HttpMethod;

import javax.net.ssl.SSLContext;

/**
 * 接口描述:  Http请求处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2021/4/22 0022 上午 9:41
 */
public interface IHttpRestTemplateManager {

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(SendEnvironmentType sendEnvironmentType, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(SendEnvironmentType sendEnvironmentType, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用自定义提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param httpMethod             提交的类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByUserDefined(SendEnvironmentType sendEnvironmentType, HttpMethod httpMethod, String sendUrl
            , Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用自定义提交数据
     *
     * @param httpMethod             提交的类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByUserDefined(HttpMethod httpMethod, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(SendEnvironmentType sendEnvironmentType, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(SendEnvironmentType sendEnvironmentType, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用自定义提交数据
     *
     * @param sendEnvironmentType    提交环境类型
     * @param httpMethod             提交的类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByUserDefined(SendEnvironmentType sendEnvironmentType, HttpMethod httpMethod, String sendUrl
            , Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;

    /**
     * 功能描述：使用自定义提交数据
     *
     * @param httpMethod             提交的类型
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @throws RtRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByUserDefined(HttpMethod httpMethod, String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, RequestResultFunction<T, V> requestResultFunction) throws RtRuntimeException;
}
